import os
import sys
import json
import logging
from typing import Dict, Any, List

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 添加项目根目录到Python路径
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../../')))

from src.local_tools.projectManager import ProjectManager
from src.tools.main import process_root_request


def generate_codes_from_tasks(tasks: List[Dict[str, Any]]) -> Dict[str, Any]:
    """
    从代码生成任务列表中批量生成代码文件，每个任务递归调用大模型生成具体代码
    
    Args:
        tasks: 代码生成任务列表，每个任务包含file_name(文件名)、function_desc(功能说明)和module_level(模块层级)
        
    Returns:
        Dict[str, Any]: 处理结果
    """
    try:
        logger.info(f"开始批量处理代码生成任务，共 {len(tasks)} 个任务")
        results = []
        
        for task in tasks:
            file_name = task.get('file_name')
            function_desc = task.get('function_desc')
            module_level = task.get('module_level')
            
            if not file_name or not function_desc or not module_level:
                logger.warning(f"任务缺少必要字段，跳过: {task}")
                continue
            
            try:
                logger.info(f"处理任务: {file_name}, 模块层级: {module_level}, 功能: {function_desc}")
                
                # 构建文件路径
                # 根据模块层级信息构建路径，例如 module_level = ['service', 'user'] 对应 src/service/user/
                path_parts = ['src'] + module_level
                directory_path = '/'.join(path_parts)
                file_path = f"{directory_path}/{file_name}"
                
                # 构建用户输入信息
                user_input = f"生成文件 {file_name}，路径 {file_path}，功能描述：{function_desc}"
                
                # 递归调用process_root_request函数，注册code_tool功能
                # 这里使用'codes_document'作为root_name，因为我们已经配置了它使用generate_codes_from_tasks工具
                # 但对于单个文件生成，我们需要一个不同的root节点来直接生成代码
                # 注意：这里假设存在一个'code_document'的root节点配置，用于单个代码文件生成
                # 如果不存在，可能需要先创建相应的配置
                result = process_root_request(
                    root_name="code_document",  # 假设有这个root节点配置用于单个文件生成
                    user_input=user_input
                )
                
                results.append({
                    "file_name": file_name,
                    "module_level": module_level,
                    "file_path": file_path,
                    "status": "success" if result.get('status') != 'error' else "error",
                    "result": result
                })
            except Exception as e:
                logger.error(f"处理任务失败 {file_name}: {str(e)}")
                results.append({
                    "file_name": file_name,
                    "module_level": module_level,
                    "status": "error",
                    "error": str(e)
                })
        
        success_count = sum(1 for r in results if r['status'] == 'success')
        logger.info(f"批量代码任务处理完成，成功: {success_count}，失败: {len(results) - success_count}")
        return {
            "status": "success",
            "results": results,
            "total": len(tasks),
            "success": success_count
        }
        
    except Exception as e:
        logger.error(f"批量处理代码生成任务时发生异常: {str(e)}")
        return {
            "status": "error",
            "error_message": str(e)
        }

# 保持原有的save_code_file函数以兼容code_tool.py中的实现
def save_code_file(file_path: str, content: str, mode: str = 'w') -> str:
    """
    保存代码文件到指定路径
    
    Args:
        file_path: 相对路径文件名
        content: 代码文件内容
        mode: 文件写入模式，'w'表示覆盖（默认），'a'表示追加
        
    Returns:
        str: 生成的文件的绝对路径
    """
    try:
        logger.info(f"开始保存代码文件: {file_path}")
        
        # 创建ProjectManager实例
        project_manager = ProjectManager()
        
        # 根据mode参数转换为ProjectManager支持的模式
        pm_mode = 'append' if mode == 'a' else 'overwrite'
        
        # 使用ProjectManager生成文件
        full_file_path = project_manager.generate_file(file_path, content, mode=pm_mode)
        
        logger.info(f"代码文件保存成功: {full_file_path}")
        return full_file_path
        
    except Exception as e:
        logger.error(f"保存代码文件失败: {str(e)}")
        raise


# 为了兼容main.py中的动态导入，添加必要的函数别名
if __name__ == "__main__":
    # 示例用法
    sample_task = {
        "file_path": "src/example/example.py",
        "content": "# 示例代码\nprint('Hello, World!')"
    }
    
    result = generate_codes_from_tasks([sample_task])
    print(json.dumps(result, ensure_ascii=False, indent=2))